package com.example.controller;

import com.example.pojo.Person;
import com.example.pojo.PersonsDTO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

/**
 * @Date 2022/3/5
 * @Created by Jonathan
 */
@Controller
@RequestMapping("/param")
public class ParamController {


    /**
     * 这种接受参数的方式代码冗余 和Servlet API耦合
     *
     * @param request
     * @return
     */

    @RequestMapping("/m1")
    public String m1(HttpServletRequest request) {
        String name = request.getParameter("name");
        System.out.println("name is :" + name);
        // 前缀和后缀去 视图解析器里面找
        return "result";


        /**
         * 接受参数的四种方式：
         * 1.基于简单变量接受请求参数 简单变量：8种基本类型 + String
         * 2.基于POJO类型接受请求参数  plain ordinary java object  简单java对象
         *      1)存在成员变量的话 提供get set
         *      2)默认提供无参构造函数
         *      3)可以实现Serializable 也可以不实现
         *      4)不实现框架或者容器所规定的接口
         * 3.接受一组简单变量的请求参数
         * 4.接受一组POJO类型的请求参数
         *
         * ****************************************************************
         *
         * 形参是8种基本类型+String的话  通过形参名与请求参数的key对应，接受参数
         * 形参不是8种基本类型+String的话  通过对应形参类型的属性名与请求参数的key对应，接受参数
         * 如果存在自定义类型转换器的话 上述两个规律不在适用
         *
         *
         *
         *
         */
    }

    @RequestMapping("/m2")
    public String m2(String name) {
        System.out.println("name is :" + name);
        // 前缀和后缀去 视图解析器里面找
        return "result";
    }

    @RequestMapping("/m3")
    public String m3(Person person) {
        System.out.println("param is :" + person);
        // 前缀和后缀去 视图解析器里面找
        return "result";
    }

    /**
     * 这个接受参数的方式好使！！！
     *
     * @param name
     * @param person
     * @return
     */
    @RequestMapping("/m4")
    public String m4(String name, Person person) {
        System.out.println("name is :" + name);
        System.out.println("param is :" + person);
        // 前缀和后缀去 视图解析器里面找
        return "result";
    }

    /**
     * 传递一组简单类型参数
     * 传参参考下面这两种形式
     * /basic/param/m5?ids=1&ids=2&ids=3
     * /basic/param/m5?ids=1,2,3
     */
    @RequestMapping("/m5")
    public String m5(Integer[] ids) {
        System.out.println("ids is :" + Arrays.toString(ids));
        // 前缀和后缀去 视图解析器里面找
        return "result";
    }

    /**
     * No primary or default constructor found for interface java.util.List
     * todo 不能使用List/ArrayList替换数组
     *
     * @param ids
     * @return
     */
    @RequestMapping("/m6")
    public String m6(List<Integer> ids) {
        System.out.println("ids is :" + ids);
        // 前缀和后缀去 视图解析器里面找
        return "result";
    }

    /**
     * 接受一组POJO参数
     * <p>
     * todo 这个为什么不行？ 再琢磨琢磨！！！
     */
    @RequestMapping("/m7")
    public String m7(PersonsDTO personsDTO) {
        //乱码问题
        personsDTO.getPersons().forEach(System.out::println);
        // 前缀和后缀去 视图解析器里面找
        return "result";
    }

}
